package com.ddyx.common.base.controller;

import com.alibaba.fastjson.JSONObject;
import com.ddyx.common.base.enums.ApiResultType;
import com.ddyx.common.framework.filter.JsonRequestWrapper;
import com.ddyx.common.utils.format.JsonFormatter;
import com.ddyx.common.utils.io.StringUtil;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;


/**
 * controller基类,提取公共的方法
 */
@Slf4j
public class BaseController {

	/**
	 * 经过了logFiler后，request被包装为JsonRequestWrapper<br>
	 * 可从request中取得json请求数据 支持自定义的动态json对象
	 */
	protected JSONObject getParameter(HttpServletRequest request) {
		JsonRequestWrapper hsr = (JsonRequestWrapper) request;
		String body = hsr.getJsonString();
		if (StringUtil.isEmpty(body)) {
			body = "{}";
		}
		return JSONObject.parseObject(body);
	}

	/**
	 * 最终结果集调用
	 */
	public Map<String, Object> result(ApiResultType type, Object obj, Integer total) {
		Map<String, Object> resultMap = new HashMap<>();
		resultMap.put("code", type.getCode());
		resultMap.put("message", type.getMessage());
		if (obj == null) {
			resultMap.put("data", new JSONObject());
		} else {
			resultMap.put("data", obj);
		}
		if (total != null) resultMap.put("total", total);
		log.info(JsonFormatter.toString(resultMap));//打印输出数据
		return resultMap;
	}

	/**
	 * 返回指定的Result结果信息
	 */
	public Map<String, Object> result(ApiResultType type) {
		return result(type, null, null);
	}

	/**
	 * 返回默认错误结果
	 */
	protected Map<String,Object> errorResult(){
		return result(ApiResultType.UNKNOWN_EXCEPTION, null, null);
	}

	/**
	 * 发生异常或者错误分支时，接口返回带错误信息的json数据。<br>
	 * code详情见ApiResultType  指定错误及异常明细
	 */
	protected Map<String, Object> errorResult(ApiResultType type) {
		return result(type, null, null);
	}

	/**
	 * 没有设置data
	 */
	public Map<String, Object> successResult() {
		return result(ApiResultType.SUCCESS, null, null);
	}

	/**
	 * 请求成功后，包装返回结果到map的data中，以便转换为更友好的json.<br>
	 * 如果没有返回结果,传null即可
	 */
	public Map<String, Object> successResult(Object obj) {
		return result(ApiResultType.SUCCESS, obj, null);
	}

	/**
	 * 请求成功  返回结果 包括结果集总条数
	 */
	public Map<String, Object> successResult(Object obj, Integer total) {
		return result(ApiResultType.SUCCESS, obj, total);
	}

}
